dat_full <- preprocessing(root_dir, data_dir)
dat <- subset(dat_full, subset=RT>0 & RT<25000) # loses 2 RTs that were judged to be outliers 25978 49871
dat_borderline <- dat
dat <- perSubjectTrim.fnc(dat, response='RT', subject='Subject', trim = 2.5)$data
## ......
## n.removed = 204 
## percent.removed = 2.797203
dat$RT_log <- log(dat$RT)

Info and Procedure (Method)

The main aim of this experiment was to see whether vague instructions would confer advantages over crisp alternatives when all instructions used numerals, and when there were vague and crisp versions of each of the comparison and matching strategies.

On each trial, first the referring expression that constituted the instruction for that trial was displayed (e.g., “Choose a square with about 10 dots”). Participants then pressed a key to indicate that they had read the instruction.

The instruction remained on screen, and after 1000 ms, the arrays appeared (see Figure below).

Response time was measured from the presentation of the arrays until the keypress indicating the participant’s choice. The trial would timeout after 60 seconds if there was no response.

In this experiment, no feedback was given. This was because, in the vague conditions, we did not regard any response as “correct” or “incorrect”, but instead as “expected response”; “borderline response”; and “extreme response”, and we did not want to draw participants’ attention to this distinction explicitly. Which choice the participant made was recorded for analysis.

Full table of instructions

We changed “fewer than” (crisp) to “far fewer than” (in vague): this was because “far fewer than” can have borderline cases whereas “fewer than” cannot have borderline cases.

Full table of instructions
Item Quantity Selection Crisp Vague
06:15:24 Small Comparison Choose a square with fewer than 20 dots Choose a square with far fewer than 20 dots
06:15:24 Small Matching Choose a square with 6 dots Choose a square with about 10 dots
06:15:24 Large Comparison Choose a square with more than 10 dots Choose a square with far more than 10 dots
06:15:24 Large Matching Choose a square with 24 dots Choose a square with about 20 dots
16:25:34 Small Comparison Choose a square with fewer than 30 dots Choose a square with far fewer than 30 dots
16:25:34 Small Matching Choose a square with 16 dots Choose a square with about 20 dots
16:25:34 Large Comparison Choose a square with more than 20 dots Choose a square with far more than 20 dots
16:25:34 Large Matching Choose a square with 34 dots Choose a square with about 30 dots
26:35:44 Small Comparison Choose a square with fewer than 40 dots Choose a square with far fewer than 40 dots
26:35:44 Small Matching Choose a square with 26 dots Choose a square with about 30 dots
26:35:44 Large Comparison Choose a square with more than 30 dots Choose a square with far more than 30 dots
26:35:44 Large Matching Choose a square with 44 dots Choose a square with about 40 dots
36:45:54 Small Comparison Choose a square with fewer than 50 dots Choose a square with far fewer than 50 dots
36:45:54 Small Matching Choose a square with 36 dots Choose a square with about 40 dots
36:45:54 Large Comparison Choose a square with more than 40 dots Choose a square with far more than 40 dots
36:45:54 Large Matching Choose a square with 54 dots Choose a square with about 50 dots

Means plots

dat_plot <- summarySEwithin2(dat, measurevar="RT_log", withinvars=c("Vagueness", "Selection", "Item"), idvar="Subject")

Hypotheses

We formulated the following hypotheses:

Results

Response times were trimmed at 25,000 ms, resulting in the loss of 2 trials that were judged to have outlier RTs. The remaining data were trimmed separately for each participant at 2.5 standard deviations below and above that participant’s mean RT, leading to the loss of 204 trials (2.8% of the remaining trials). RTs in milliseconds were log-transformed so that they better approximated a normal distribution for the purposes of analysis.

The first set of models

dat_model <- dat
dat_model$c_Vag <- ifelse(dat_model$Vagueness=="Crisp", -0.5, 0.5)
dat_model$c_Sel <- ifelse(dat_model$Selection=="Comparison", -0.5, 0.5)
dat_model$c_Itm <- ifelse(dat_model$Item=="06:15:24", -.75, ifelse(dat_model$Item=="16:25:34", -.25, ifelse(dat_model$Item=="26:35:44", .25, .75)))
rtlmer = lmerTest::lmer(data=dat_model, RT_log ~ c_Vag * c_Sel + c_Itm + (1 + c_Vag * c_Sel + c_Itm | Subject))
pretty_coef_table(rtlmer, "rt_lmer_full_model_all_items")
rt_lmer_full_model_all_items
term 𝛽   s.e.  d.f. 𝑡  𝑝   Pr(>|t|)  sig.
c_Vag -0.0051 0.014 36.94 -0.37 7.16e-01 0.716
c_Sel 0.1619 0.026 36.99 6.24 2.97e-07 <0.001 ***
c_Itm 0.0580 0.018 36.92 3.23 2.60e-03 <0.01  **
c_Vag:c_Sel 0.1324 0.031 36.87 4.23 1.49e-04 <0.001 ***
dat_model <- subset(dat, subset=Selection=='Comparison')
dat_model$c_Vag <- ifelse(dat_model$Vagueness=="Crisp", -0.5, 0.5)
dat_model$c_Itm <- ifelse(dat_model$Item=="06:15:24", -.75, ifelse(dat_model$Item=="16:25:34", -.25, ifelse(dat_model$Item=="26:35:44", .25, .75)))
comp_lmer <- lmerTest::lmer(data=dat_model, RT_log ~ c_Vag + c_Itm + (1 + c_Vag + c_Itm | Subject))
pretty_coef_table(comp_lmer, "rt_lmer_for_comparison_all_items")
rt_lmer_for_comparison_all_items
term 𝛽   s.e.  d.f. 𝑡  𝑝   Pr(>|t|)  sig.
c_Vag -0.071 0.020 36.99 -3.52 1.15e-03 <0.01  **
c_Itm 0.090 0.020 37.02 4.61 4.68e-05 <0.001 ***
dat_model <- subset(dat, subset=Selection=='Matching')
dat_model$c_Vag <- ifelse(dat_model$Vagueness=="Crisp", -0.5, 0.5)
dat_model$c_Itm <- ifelse(dat_model$Item=="06:15:24", -.75, ifelse(dat_model$Item=="16:25:34", -.25, ifelse(dat_model$Item=="26:35:44", .25, .75)))
match_lmer <- lmerTest::lmer(data=dat_model, RT_log ~ c_Vag + c_Itm + (1 + c_Vag + c_Itm | Subject))
pretty_coef_table(match_lmer, "rt_lmer_for_matching_all_items")
rt_lmer_for_matching_all_items
term 𝛽   s.e.  d.f. 𝑡  𝑝   Pr(>|t|)  sig.
c_Vag 0.062 0.021 36.32 2.91 6.14e-03 <0.01  **
c_Itm 0.025 0.022 36.62 1.12 2.71e-01 0.271

Considering the first set of models:

  • [Hypothesis 1] Crisp/Vague RT:
    • Vague instructions should result in faster responses than crisp instructions : Vague instructions resulted in faster responses than crisp instructions but the difference was not significant (p=0.716).
  • [Hypothesis 2] Comparison/Matching RT:
    • Instructions that allow comparison should result in faster responses than instructions that necessitate matching : comparison instructions resulted in faster responses than matching instructions, and the difference was significant (p<0.001).
  • [Hypothesis 3] Vagueness effect differs between comparison and matching
    • The effects of vagueness should differ when the selection task is comparison versus when it is matching : Vagueness exerted effects in different directions for the two selection tasks (p<0.001). Separate analyses at each level of selection provided evidence that vague instructions resulted in faster responses than crisp instructions for the comparison condition (p<0.01); and slower responses than crisp instructions in the matching condition (p<0.01).

The second set of models

The second set of models considered were conducted to test for main effects in the presence of interactions involving those main effects (after Levy, 2018).

The variables are: Vagueness 2 levels (X) Item 4 levels (Y) Selection 2 levels (Z)

Note that the null-hypothsesis model includes random slopes for the main effect of X; Y; and Z; as well as for their interactions – including a seperate random slope for all combiations of X, Y, and Z achieves this.

#dat$XYZ <- with(dat, factor(paste(Vagueness,Item,Selection)))
dat_model <- subset(dat, select=c(Subject, Item, Vagueness, Selection, RT_log))

Item.numeric <- sapply(dat_model$Item,function(i) contr.sum(4)[i,])
dat_model$Item1 <- Item.numeric[1,]
dat_model$Item2 <- Item.numeric[2,]
dat_model$Item3 <- Item.numeric[3,]

Selection.numeric <- sapply(dat_model$Selection,function(i) contr.sum(2)[i,])
dat_model$Selection1 <- Selection.numeric[]

Vagueness.numeric <- sapply(dat_model$Vagueness,function(i) contr.sum(2)[i,])
dat_model$Vagueness1 <- Vagueness.numeric[]

dat_model$c_Itm <- ifelse(dat_model$Item=="06:15:24", -.75, ifelse(dat_model$Item=="16:25:34", -.25, ifelse(dat_model$Item=="26:35:44", .25, .75)))
  
head(dat_model)
##   Subject     Item Vagueness  Selection   RT_log Item1 Item2 Item3
## 1     s01 06:15:24     Vague Comparison 6.903747     1     0     0
## 2     s01 16:25:34     Crisp   Matching 7.194437     0     1     0
## 3     s01 26:35:44     Vague Comparison 6.987490     0     0     1
## 4     s01 36:45:54     Vague Comparison 7.118016    -1    -1    -1
## 5     s01 06:15:24     Crisp   Matching 7.221836     1     0     0
## 6     s01 16:25:34     Crisp Comparison 6.878326     0     1     0
##   Selection1 Vagueness1 c_Itm
## 1          1         -1 -0.75
## 2         -1          1 -0.25
## 3          1         -1  0.25
## 4          1         -1  0.75
## 5         -1          1 -0.75
## 6          1          1 -0.25
# make the null model
null.model <- lmer(RT_log ~ 
                     Item1 + Vagueness1:Item1 +
                     Item2 + Vagueness1:Item2 + 
                     Item3 + Vagueness1:Item3 + 
                     Selection1 + Vagueness1:Selection1 + 
                     (Vagueness1 * Selection1 * c_Itm |Subject), dat_model, REML=FALSE)
## Warning in commonArgs(par, fn, control, environment()): maxfun < 10 *
## length(par)^2 is not recommended.
pretty_coef_table(null.model, "null model")
null model
term 𝛽   s.e.  d.f. 𝑡  𝑝   Pr(>|t|)  sig.
Item1 -0.054 0.0136 55.79 -3.98 2.00e-04 <0.001 ***
Item2 0.014 0.0094 957.52 1.46 1.44e-01 0.144
Item3 0.028 0.0094 959.97 3.01 2.70e-03 <0.01  **
Selection1 -0.051 0.0118 37.90 -4.33 1.07e-04 <0.001 ***
Item1:Vagueness1 -0.040 0.0092 356.83 -4.36 1.68e-05 <0.001 ***
Vagueness1:Item2 0.019 0.0088 5499.98 2.18 2.92e-02 <0.05 
Vagueness1:Item3 0.024 0.0088 5543.55 2.76 5.80e-03 <0.01  **
Vagueness1:Selection1 0.028 0.0075 41.03 3.70 6.32e-04 <0.001 ***
# make the full model
full.model <- lmer(RT_log ~ 
                     Item1 + Vagueness1:Item1 +
                     Item2 + Vagueness1:Item2 + 
                     Item3 + Vagueness1:Item3 + 
                     Selection1 + Vagueness1:Selection1 + Vagueness1 +
                     (Vagueness1 * Selection1 * c_Itm |Subject), dat_model, REML=FALSE)
## Warning in commonArgs(par, fn, control, environment()): maxfun < 10 *
## length(par)^2 is not recommended.
pretty_coef_table(full.model, "full model")
full model
term 𝛽   s.e.  d.f. 𝑡  𝑝   Pr(>|t|)  sig.
Item1 -0.0523 0.0140 54.26 -3.72 4.70e-04 <0.001 ***
Item2 0.0144 0.0095 849.10 1.51 1.31e-01 0.131
Item3 0.0278 0.0095 850.66 2.92 3.55e-03 <0.01  **
Selection1 -0.0524 0.0121 37.96 -4.33 1.05e-04 <0.001 ***
Vagueness1 0.0033 0.0068 38.78 0.48 6.32e-01 0.632
Item1:Vagueness1 -0.0395 0.0092 303.48 -4.30 2.32e-05 <0.001 ***
Vagueness1:Item2 0.0194 0.0088 5307.77 2.20 2.81e-02 <0.05 
Vagueness1:Item3 0.0242 0.0088 5345.92 2.74 6.11e-03 <0.01  **
Vagueness1:Selection1 0.0277 0.0075 41.07 3.69 6.47e-04 <0.001 ***
# do model comparison between the null and full models
anova(null.model, full.model)
## Data: dat_model
## Models:
## null.model: RT_log ~ Item1 + Vagueness1:Item1 + Item2 + Vagueness1:Item2 + 
## null.model:     Item3 + Vagueness1:Item3 + Selection1 + Vagueness1:Selection1 + 
## null.model:     (Vagueness1 * Selection1 * c_Itm | Subject)
## full.model: RT_log ~ Item1 + Vagueness1:Item1 + Item2 + Vagueness1:Item2 + 
## full.model:     Item3 + Vagueness1:Item3 + Selection1 + Vagueness1:Selection1 + 
## full.model:     Vagueness1 + (Vagueness1 * Selection1 * c_Itm | Subject)
##            Df    AIC    BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)
## null.model 46 8539.7 8855.6 -4223.9   8447.7                         
## full.model 47 8541.6 8864.4 -4223.8   8447.6 0.0973      1     0.7551